I decided to start asking some questions of the data given the metrics defined earlier. I decided to look into the correlation between pairs of metrics relative to a third:

Market Age

“How does the correlation between days_to_market and on_market_age change by route of administration?”:

suppressWarnings(suppressMessages({
library(smart.data)

if (!"smrt_drugs" %in% .cache$keys()){
  smrt.drug_obs_data <- smart.data$
    new(x = .cache$get("drug_obs_data") |> print(), name = "drugs")$
    taxonomy.rule(
      term.map = if ("smrt_drug_taxonomy" %in% .cache$keys()){ .cache$get("smrt_drug_taxonomy") } else { data.table(term = "metrics", desc = "Metrics related to events and other descriptive statistics") }
      , update = !("smrt_drug_taxonomy" %in% .cache$keys())
      )$
    cache_mgr(action = upd) |>
    invisible();
  
  .cache$set("smrt_drugs", smrt.drug_obs_data);
  .cache$set("smrt_drug_taxonomy", smrt.drug_obs_data$smart.rules$for_usage)
} else { 
  invisible(smart.data$new(as.data.table(x = 1), "none"))
  .cache$get("smrt_drugs")$cache_mgr(action = upd) 
}

get.smart("drugs")$use(identifier, metrics, retain = c(route), subset = days_to_market >= 0) |> 
  # View() 
  setkey(route, alt_ndc, days_to_market, on_market_age) |>
  split_f(~route) |>
  map_dbl(\(x) x %$% cor(as.numeric(days_to_market), as.numeric(on_market_age))) |>
  modify_if(is.na, \(x) 0) |> 
  (\(x){ 
    x <- x[order(x)]
    nm <- names(x)
    z <- calc.zero_mean(x, as.zscore = TRUE, use.population = TRUE)
    y <- ratio(x + abs(min(x)), type="pareto", decimals = 6)
    
    .wh_scale <- 800 * c(1.2, .7)
    
    plot_ly(
      x = z
      , y = y
      , size = 5 * exp(x) + 10
      , width = .wh_scale[1]
      , height = .wh_scale[2]
      , hoverinfo = "text"
      , hovertext = sprintf(fmt ="<b>%s</b><br><b>Y:</b> %.2f%% of Total<br><b>Cor</b>(days_to_market, on_market_age): %.2f<br><b>Z-score</b>(X): %.2f", nm, y * 100, x, z)
      , color = x
      , stroke = I("black")
      , type = "scatter", mode = "markers"
      ) |>
      config(mathjax = "cdn", displayModeBar = FALSE) |>
      layout(
        xaxis = list(
            title = list(
              text = "Z-score<sub>X</sub>: X | Cor(m<sub>0</sub>, m<sub>1</sub>) ~ Route"
              , font = list(size = 16, family = "Georgia"))
            , gridcolor = "#FFFFFF"
            )
        , yaxis = list(
            title = list(
              text = "Cumulative Proportion (X)"
              , font = list(size = 16, family = "Georgia"))
            , gridcolor = "#FFFFFF"
            )
        , title = list(
            text = sprintf("Correlation Coefficient (<span style='text-emphasis-position:under; text-emphais: filled red double-circle; '>%s</span> vs. <span style='text-emphasis-position:under; text-emphais: filled red double-circle; '>%s</span>) by Route of Administration", "days_to_market", "on_market_age")
            , font = list(family = "Georgia"))
        , plot_bgcolor = rgb(.8,.8,.8)
        , margin = list(b = 30, t = 50)
        ) 
  })()
}))
Warning: `line.width` does not currently support multiple values.Warning: `line.width` does not currently support multiple values.

Days Absent from Market

“How does the correlation between days_to_market and days_market_absent change by route of administration?”:

get.smart("drugs")$use(identifier, metrics, retain = c(route), subset = days_to_market >= 0) |> 
  # View() 
  setkey(route, alt_ndc, days_market_absent, on_market_age) |>
  split_f(~route) |>
  map_dbl(\(x) x %$% suppressWarnings(cor(as.numeric(days_market_absent), as.numeric(on_market_age)))) |>
  modify_if(is.na, \(x) 0) |> 
  (\(x){ 
    x <- x[order(x)]
    nm <- names(x)
    z <- calc.zero_mean(x, as.zscore = TRUE, use.population = TRUE)
    y <- ratio(x + abs(min(x)), type="pareto", decimals = 6)
    
    .wh_scale <- 800 * c(1.2, .7)
    
    plot_ly(
      x = z
      , y = y
      , size = 5 * exp(x) + 10
      , width = .wh_scale[1]
      , height = .wh_scale[2]
      , hoverinfo = "text"
      , hovertext = sprintf(fmt ="<b>%s</b><br><b>Y:</b> %.2f%% of Total<br><b>Cor</b>(days_to_market, days_market_absent): %.2f<br><b>Z-score</b>(X): %.2f", nm, y * 100, x, z)
      , color = x
      , stroke = I("black")
      , type = "scatter"
      , mode = "markers"
      ) |>
      config(mathjax = "cdn", displayModeBar = FALSE) |>
      layout(
        xaxis = list(
            title = list(
              text = "Z-score<sub>X</sub>: X | Cor(m<sub>0</sub>, m<sub>1</sub>) ~ Route"
              , font = list(size = 16, family = "Georgia"))
            , gridcolor = "#FFFFFF"
            )
        , yaxis = list(
            title = list(
              text = "Cumulative Proportion (X)"
              , font = list(size = 16, family = "Georgia"))
            , gridcolor = "#FFFFFF"
            )
        , title = list(
            text = sprintf("Correlation Coefficient (<span style='text-emphasis-position:under; text-emphais: filled red double-circle; '>%s</span> vs. <span style='text-emphasis-position:under; text-emphais: filled red double-circle; '>%s</span>) by Route of Administration", "days_to_market", "days_market_absent")
            , font = list(family = "Georgia"))
        , plot_bgcolor = rgb(.8,.8,.8)
        , margin = list(b = 30, t = 50)
        ) 
})()
Warning: `line.width` does not currently support multiple values.Warning: `line.width` does not currently support multiple values.
Market age relative to days to market shows more variability in correlation distribution. This is not to make an claim of statistically significant differentiation; however, it may be worth exploring whether or not there are clusters of administration routes based on event correlation. A future update may address this, but this is as deep of exploration I’ll go for now.

LS0tDQp0aXRsZTogIlF1ZXN0aW9uIEk6IENvcnJlbGF0aW9uIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIGNzczogbWFya2Rvd24uY3NzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgY3NzOiBtYXJrZG93bi5jc3MNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCnBhcmFtczoNCiAgZGF0YV9kaXI6IGRhdGENCiAgY3Jhbl9saWJzOiAhciBjKCdwdXJycicsICdqc29ubGl0ZScsICdodHRyJywgJ3N1bW1hcnl0b29scycsICdtdW5zZWxsJywgJ2NhY2hlbScsICdTbWFydEVEQScsICdodG1sdG9vbHMnLCAnc2xpZGVyJywgJ3N0cmluZ2knLCAnbWFncml0dHInLCAncGxvdGx5JywgJ0RUJywgJ2RhdGEudGFibGUnLCAncGRmdG9vbHMnLCAnbHVicmlkYXRlJywgJ2Z1dHVyZScsICdmdXJycicsICdmdXR1cmUuY2FsbHInKQ0KICBnaXRfbGliczogIXIgcGFzdGUwKCdib29rLm9mLicsIGMoJ3V0aWxpdGllcycsICdmZWF0dXJlcycsICd3b3JrZmxvdycpKSB8PiBjKCdhcmNoaXRlY3QnLCAnc21hcnQuZGF0YScsICdldmVudC52ZWN0b3JzJykNCiAgcmVmcmVzaDogIXIgRkFMU0UNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldCgNCiAgb3B0c19jaHVuayA9IGxpc3QoY2FjaGU9VFJVRSwgY2FjaGUubGF6eT1UUlVFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFKQ0KICApDQoNCnNvdXJjZSgic2V0dXAuUiIsIGxvY2FsPVRSVUUpDQpgYGANCg0KYGBgez1qc30NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBhc3luYw0KICBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL21hdGhqYXgvMi43LjcvTWF0aEpheC5qcz9jb25maWc9VGVYLU1NTC1BTV9DSFRNTCI+DQo8L3NjcmlwdD4NCmBgYA0KDQojIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQpJIGRlY2lkZWQgdG8gc3RhcnQgYXNraW5nIHNvbWUgcXVlc3Rpb25zIG9mIHRoZSBkYXRhIGdpdmVuIHRoZSBtZXRyaWNzIGRlZmluZWQgZWFybGllci4gIEkgZGVjaWRlZCB0byBsb29rIGludG8gdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gcGFpcnMgb2YgbWV0cmljcyByZWxhdGl2ZSB0byBhIHRoaXJkOg0KDQojIyBNYXJrZXQgQWdlIA0KDQoiSG93IGRvZXMgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gKmBkYXlzX3RvX21hcmtldGAqIGFuZCAqYG9uX21hcmtldF9hZ2VgKiBjaGFuZ2UgYnkgcm91dGUgb2YgYWRtaW5pc3RyYXRpb24/IjoNCg0KYGBge3IgTUVUUklDU19DT1JSRUxBVElPTl9JfSANCnN1cHByZXNzV2FybmluZ3Moc3VwcHJlc3NNZXNzYWdlcyh7DQpsaWJyYXJ5KHNtYXJ0LmRhdGEpDQoNCmlmICghInNtcnRfZHJ1Z3MiICVpbiUgLmNhY2hlJGtleXMoKSl7DQogIHNtcnQuZHJ1Z19vYnNfZGF0YSA8LSBzbWFydC5kYXRhJA0KICAgIG5ldyh4ID0gLmNhY2hlJGdldCgiZHJ1Z19vYnNfZGF0YSIpIHw+IHByaW50KCksIG5hbWUgPSAiZHJ1Z3MiKSQNCiAgICB0YXhvbm9teS5ydWxlKA0KICAgICAgdGVybS5tYXAgPSBpZiAoInNtcnRfZHJ1Z190YXhvbm9teSIgJWluJSAuY2FjaGUka2V5cygpKXsgLmNhY2hlJGdldCgic21ydF9kcnVnX3RheG9ub215IikgfSBlbHNlIHsgZGF0YS50YWJsZSh0ZXJtID0gIm1ldHJpY3MiLCBkZXNjID0gIk1ldHJpY3MgcmVsYXRlZCB0byBldmVudHMgYW5kIG90aGVyIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MiKSB9DQogICAgICAsIHVwZGF0ZSA9ICEoInNtcnRfZHJ1Z190YXhvbm9teSIgJWluJSAuY2FjaGUka2V5cygpKQ0KICAgICAgKSQNCiAgICBjYWNoZV9tZ3IoYWN0aW9uID0gdXBkKSB8Pg0KICAgIGludmlzaWJsZSgpOw0KICANCiAgLmNhY2hlJHNldCgic21ydF9kcnVncyIsIHNtcnQuZHJ1Z19vYnNfZGF0YSk7DQogIC5jYWNoZSRzZXQoInNtcnRfZHJ1Z190YXhvbm9teSIsIHNtcnQuZHJ1Z19vYnNfZGF0YSRzbWFydC5ydWxlcyRmb3JfdXNhZ2UpDQp9IGVsc2UgeyANCiAgaW52aXNpYmxlKHNtYXJ0LmRhdGEkbmV3KGFzLmRhdGEudGFibGUoeCA9IDEpLCAibm9uZSIpKQ0KICAoXCh4KXsNCiAgICB4JGRhdGEgPC0gLmNhY2hlJGdldCgiZHJ1Z19vYnNfZGF0YSIpDQogICAgeCRjYWNoZV9tZ3IoYWN0aW9uID0gdXBkKQ0KICB9KSguY2FjaGUkZ2V0KCJzbXJ0X2RydWdzIikpDQp9DQoNCmdldC5zbWFydCgiZHJ1Z3MiKSR1c2UoaWRlbnRpZmllciwgbWV0cmljcywgcmV0YWluID0gYyhyb3V0ZSksIHN1YnNldCA9IGRheXNfdG9fbWFya2V0ID49IDApIHw+IA0KICAjIFZpZXcoKSANCiAgc2V0a2V5KHJvdXRlLCBhbHRfbmRjLCBkYXlzX3RvX21hcmtldCwgb25fbWFya2V0X2FnZSkgfD4NCiAgc3BsaXRfZih+cm91dGUpIHw+DQogIG1hcF9kYmwoXCh4KSB4ICUkJSBjb3IoYXMubnVtZXJpYyhkYXlzX3RvX21hcmtldCksIGFzLm51bWVyaWMob25fbWFya2V0X2FnZSkpKSB8Pg0KICBtb2RpZnlfaWYoaXMubmEsIFwoeCkgMCkgfD4gDQogIChcKHgpeyANCiAgICB4IDwtIHhbb3JkZXIoeCldDQogICAgbm0gPC0gbmFtZXMoeCkNCiAgICB6IDwtIGNhbGMuemVyb19tZWFuKHgsIGFzLnpzY29yZSA9IFRSVUUsIHVzZS5wb3B1bGF0aW9uID0gVFJVRSkNCiAgICB5IDwtIHJhdGlvKHggKyBhYnMobWluKHgpKSwgdHlwZT0icGFyZXRvIiwgZGVjaW1hbHMgPSA2KQ0KICAgIA0KICAgIC53aF9zY2FsZSA8LSA4MDAgKiBjKDEuMiwgLjcpDQogICAgDQogICAgcGxvdF9seSgNCiAgICAgIHggPSB6DQogICAgICAsIHkgPSB5DQogICAgICAsIHNpemUgPSA1ICogZXhwKHgpICsgMTANCiAgICAgICwgd2lkdGggPSAud2hfc2NhbGVbMV0NCiAgICAgICwgaGVpZ2h0ID0gLndoX3NjYWxlWzJdDQogICAgICAsIGhvdmVyaW5mbyA9ICJ0ZXh0Ig0KICAgICAgLCBob3ZlcnRleHQgPSBzcHJpbnRmKGZtdCA9IjxiPiVzPC9iPjxicj48Yj5ZOjwvYj4gJS4yZiUlIG9mIFRvdGFsPGJyPjxiPkNvcjwvYj4oZGF5c190b19tYXJrZXQsIG9uX21hcmtldF9hZ2UpOiAlLjJmPGJyPjxiPlotc2NvcmU8L2I+KFgpOiAlLjJmIiwgbm0sIHkgKiAxMDAsIHgsIHopDQogICAgICAsIGNvbG9yID0geA0KICAgICAgLCBzdHJva2UgPSBJKCJibGFjayIpDQogICAgICAsIHR5cGUgPSAic2NhdHRlciIsIG1vZGUgPSAibWFya2VycyINCiAgICAgICkgfD4NCiAgICAgIGNvbmZpZyhtYXRoamF4ID0gImNkbiIsIGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpIHw+DQogICAgICBsYXlvdXQoDQogICAgICAgIHhheGlzID0gbGlzdCgNCiAgICAgICAgICAgIHRpdGxlID0gbGlzdCgNCiAgICAgICAgICAgICAgdGV4dCA9ICJaLXNjb3JlPHN1Yj5YPC9zdWI+OiBYIHwgQ29yKG08c3ViPjA8L3N1Yj4sIG08c3ViPjE8L3N1Yj4pIH4gUm91dGUiDQogICAgICAgICAgICAgICwgZm9udCA9IGxpc3Qoc2l6ZSA9IDE2LCBmYW1pbHkgPSAiR2VvcmdpYSIpKQ0KICAgICAgICAgICAgLCBncmlkY29sb3IgPSAiI0ZGRkZGRiINCiAgICAgICAgICAgICkNCiAgICAgICAgLCB5YXhpcyA9IGxpc3QoDQogICAgICAgICAgICB0aXRsZSA9IGxpc3QoDQogICAgICAgICAgICAgIHRleHQgPSAiQ3VtdWxhdGl2ZSBQcm9wb3J0aW9uIChYKSINCiAgICAgICAgICAgICAgLCBmb250ID0gbGlzdChzaXplID0gMTYsIGZhbWlseSA9ICJHZW9yZ2lhIikpDQogICAgICAgICAgICAsIGdyaWRjb2xvciA9ICIjRkZGRkZGIg0KICAgICAgICAgICAgKQ0KICAgICAgICAsIHRpdGxlID0gbGlzdCgNCiAgICAgICAgICAgIHRleHQgPSBzcHJpbnRmKCJDb3JyZWxhdGlvbiBDb2VmZmljaWVudCAoPHNwYW4gc3R5bGU9J3RleHQtZW1waGFzaXMtcG9zaXRpb246dW5kZXI7IHRleHQtZW1waGFpczogZmlsbGVkIHJlZCBkb3VibGUtY2lyY2xlOyAnPiVzPC9zcGFuPiB2cy4gPHNwYW4gc3R5bGU9J3RleHQtZW1waGFzaXMtcG9zaXRpb246dW5kZXI7IHRleHQtZW1waGFpczogZmlsbGVkIHJlZCBkb3VibGUtY2lyY2xlOyAnPiVzPC9zcGFuPikgYnkgUm91dGUgb2YgQWRtaW5pc3RyYXRpb24iLCAiZGF5c190b19tYXJrZXQiLCAib25fbWFya2V0X2FnZSIpDQogICAgICAgICAgICAsIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJHZW9yZ2lhIikpDQogICAgICAgICwgcGxvdF9iZ2NvbG9yID0gcmdiKC44LC44LC44KQ0KICAgICAgICAsIG1hcmdpbiA9IGxpc3QoYiA9IDMwLCB0ID0gNTApDQogICAgICAgICkgDQogIH0pKCkNCn0pKQ0KYGBgDQoNCiMjIERheXMgQWJzZW50IGZyb20gTWFya2V0IA0KDQoqIkhvdyBkb2VzIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGBkYXlzX3RvX21hcmtldGAgYW5kIGBkYXlzX21hcmtldF9hYnNlbnRgIGNoYW5nZSBieSByb3V0ZSBvZiBhZG1pbmlzdHJhdGlvbj8iKjoNCg0KYGBge3IgTUVUUklDU19DT1JSRUxBVElPTl9JSX0gDQpnZXQuc21hcnQoImRydWdzIikkdXNlKGlkZW50aWZpZXIsIG1ldHJpY3MsIHJldGFpbiA9IGMocm91dGUpLCBzdWJzZXQgPSBkYXlzX3RvX21hcmtldCA+PSAwKSB8PiANCiAgIyBWaWV3KCkgDQogIHNldGtleShyb3V0ZSwgYWx0X25kYywgZGF5c19tYXJrZXRfYWJzZW50LCBvbl9tYXJrZXRfYWdlKSB8Pg0KICBzcGxpdF9mKH5yb3V0ZSkgfD4NCiAgbWFwX2RibChcKHgpIHggJSQlIHN1cHByZXNzV2FybmluZ3MoY29yKGFzLm51bWVyaWMoZGF5c19tYXJrZXRfYWJzZW50KSwgYXMubnVtZXJpYyhvbl9tYXJrZXRfYWdlKSkpKSB8Pg0KICBtb2RpZnlfaWYoaXMubmEsIFwoeCkgMCkgfD4gDQogIChcKHgpeyANCiAgICB4IDwtIHhbb3JkZXIoeCldDQogICAgbm0gPC0gbmFtZXMoeCkNCiAgICB6IDwtIGNhbGMuemVyb19tZWFuKHgsIGFzLnpzY29yZSA9IFRSVUUsIHVzZS5wb3B1bGF0aW9uID0gVFJVRSkNCiAgICB5IDwtIHJhdGlvKHggKyBhYnMobWluKHgpKSwgdHlwZT0icGFyZXRvIiwgZGVjaW1hbHMgPSA2KQ0KICAgIA0KICAgIC53aF9zY2FsZSA8LSA4MDAgKiBjKDEuMiwgLjcpDQogICAgDQogICAgcGxvdF9seSgNCiAgICAgIHggPSB6DQogICAgICAsIHkgPSB5DQogICAgICAsIHNpemUgPSA1ICogZXhwKHgpICsgMTANCiAgICAgICwgd2lkdGggPSAud2hfc2NhbGVbMV0NCiAgICAgICwgaGVpZ2h0ID0gLndoX3NjYWxlWzJdDQogICAgICAsIGhvdmVyaW5mbyA9ICJ0ZXh0Ig0KICAgICAgLCBob3ZlcnRleHQgPSBzcHJpbnRmKGZtdCA9IjxiPiVzPC9iPjxicj48Yj5ZOjwvYj4gJS4yZiUlIG9mIFRvdGFsPGJyPjxiPkNvcjwvYj4oZGF5c190b19tYXJrZXQsIGRheXNfbWFya2V0X2Fic2VudCk6ICUuMmY8YnI+PGI+Wi1zY29yZTwvYj4oWCk6ICUuMmYiLCBubSwgeSAqIDEwMCwgeCwgeikNCiAgICAgICwgY29sb3IgPSB4DQogICAgICAsIHN0cm9rZSA9IEkoImJsYWNrIikNCiAgICAgICwgdHlwZSA9ICJzY2F0dGVyIg0KICAgICAgLCBtb2RlID0gIm1hcmtlcnMiDQogICAgICApIHw+DQogICAgICBjb25maWcobWF0aGpheCA9ICJjZG4iLCBkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSB8Pg0KICAgICAgbGF5b3V0KA0KICAgICAgICB4YXhpcyA9IGxpc3QoDQogICAgICAgICAgICB0aXRsZSA9IGxpc3QoDQogICAgICAgICAgICAgIHRleHQgPSAiWi1zY29yZTxzdWI+WDwvc3ViPjogWCB8IENvcihtPHN1Yj4wPC9zdWI+LCBtPHN1Yj4xPC9zdWI+KSB+IFJvdXRlIg0KICAgICAgICAgICAgICAsIGZvbnQgPSBsaXN0KHNpemUgPSAxNiwgZmFtaWx5ID0gIkdlb3JnaWEiKSkNCiAgICAgICAgICAgICwgZ3JpZGNvbG9yID0gIiNGRkZGRkYiDQogICAgICAgICAgICApDQogICAgICAgICwgeWF4aXMgPSBsaXN0KA0KICAgICAgICAgICAgdGl0bGUgPSBsaXN0KA0KICAgICAgICAgICAgICB0ZXh0ID0gIkN1bXVsYXRpdmUgUHJvcG9ydGlvbiAoWCkiDQogICAgICAgICAgICAgICwgZm9udCA9IGxpc3Qoc2l6ZSA9IDE2LCBmYW1pbHkgPSAiR2VvcmdpYSIpKQ0KICAgICAgICAgICAgLCBncmlkY29sb3IgPSAiI0ZGRkZGRiINCiAgICAgICAgICAgICkNCiAgICAgICAgLCB0aXRsZSA9IGxpc3QoDQogICAgICAgICAgICB0ZXh0ID0gc3ByaW50ZigiQ29ycmVsYXRpb24gQ29lZmZpY2llbnQgKDxzcGFuIHN0eWxlPSd0ZXh0LWVtcGhhc2lzLXBvc2l0aW9uOnVuZGVyOyB0ZXh0LWVtcGhhaXM6IGZpbGxlZCByZWQgZG91YmxlLWNpcmNsZTsgJz4lczwvc3Bhbj4gdnMuIDxzcGFuIHN0eWxlPSd0ZXh0LWVtcGhhc2lzLXBvc2l0aW9uOnVuZGVyOyB0ZXh0LWVtcGhhaXM6IGZpbGxlZCByZWQgZG91YmxlLWNpcmNsZTsgJz4lczwvc3Bhbj4pIGJ5IFJvdXRlIG9mIEFkbWluaXN0cmF0aW9uIiwgImRheXNfdG9fbWFya2V0IiwgImRheXNfbWFya2V0X2Fic2VudCIpDQogICAgICAgICAgICAsIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJHZW9yZ2lhIikpDQogICAgICAgICwgcGxvdF9iZ2NvbG9yID0gcmdiKC44LC44LC44KQ0KICAgICAgICAsIG1hcmdpbiA9IGxpc3QoYiA9IDMwLCB0ID0gNTApDQogICAgICAgICkgDQp9KSgpDQoNCmBgYA0KDQo8L2Rpdj4NCk1hcmtldCBhZ2UgcmVsYXRpdmUgdG8gZGF5cyB0byBtYXJrZXQgc2hvd3MgbW9yZSB2YXJpYWJpbGl0eSBpbiBjb3JyZWxhdGlvbiBkaXN0cmlidXRpb24uICBUaGlzIGlzIG5vdCB0byBtYWtlIGFuIGNsYWltIG9mIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZGlmZmVyZW50aWF0aW9uOyBob3dldmVyLCBpdCBtYXkgYmUgd29ydGggZXhwbG9yaW5nIHdoZXRoZXIgb3Igbm90IHRoZXJlIGFyZSBjbHVzdGVycyBvZiBhZG1pbmlzdHJhdGlvbiByb3V0ZXMgYmFzZWQgb24gZXZlbnQgY29ycmVsYXRpb24uICBBIGZ1dHVyZSB1cGRhdGUgbWF5IGFkZHJlc3MgdGhpcywgYnV0IHRoaXMgaXMgYXMgZGVlcCBvZiBleHBsb3JhdGlvbiBJJ2xsIGdvIGZvciBub3cuDQo8YnI+DQo8YnI+DQo8ZGl2Pg0KDQo=